/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.FarmacologicoFisica;
import fisica.CapaFisica;
import hibernate.objeto.Antecedente;
import hibernate.objeto.Farmacologico;
import hibernate.objeto.NombreComercialMedicamento;
import hibernate.objeto.Paciente;
import hibernate.objeto.TratamientoMedicamentoso;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Vector;
import presentacion.CapaPresentacion;

/**
 *
 * @author Gonzalo
 */
public class FarmacologicoLogica extends CapaLogica {

    /**
     * Crea y persiste los objetos TratamientoMedicamentoso Farmacologico.
     *
     * @param datosFarmacologico Los datos correspondientes al apartado
     * Tratamiento Medicamentoso Farmacologico
     * @param tratamientoMedicamentoso El tratamiento medicamentoso al cual se
     * asocia
     * @return true si se agregó correctamente, false en caso contrario
     */
    public static boolean agregarTratamientoMedicamentosoFarmacologico(Object[][]
            datosFarmacologico, TratamientoMedicamentoso tratamientoMedicamentoso) {
        //Crea el objeto Farmacologico
        Farmacologico farmacologico;

        int cantidadObjetosACrear = datosFarmacologico.length;
        int objetosCreados = 0;

        for (int i = 0; i < cantidadObjetosACrear; i++) {
            farmacologico = crearObjetoFarmacologico(datosFarmacologico[i], null);
            
            //Tratamiento
            farmacologico.setTratamientoMedicamentoso(tratamientoMedicamentoso);

            if (!CapaFisica.guardarOActualizarObjeto(farmacologico)) {
                return false;
            } else {
                objetosCreados = objetosCreados + 1;
            }
        }

        if (objetosCreados == cantidadObjetosACrear) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea y persiste los objetos Antecedente Farmacologico.
     *
     * @param datosAntecedentesFarmacologico Los datos correspondientes al apartado
     * Antecedentes Farmacologico
     * @param antecedente El antecedente al cual se asocia
     * @return true si se agregó correctamente, false en caso contrario
     */
    public static boolean agregarAntecedenteFarmacologico(
            Object[][] datosAntecedentesFarmacologico, Antecedente antecedente) {
        //Crea el objeto Farmacologico
        Farmacologico antecedenteFarmacologico;

        int cantidadObjetosACrear = datosAntecedentesFarmacologico.length;
        int objetosCreados = 0;

        for (int i = 0; i < cantidadObjetosACrear; i++) {
            antecedenteFarmacologico = crearObjetoFarmacologico(
                    datosAntecedentesFarmacologico[i], null);
            //Antecedente
            antecedenteFarmacologico.setAntecedente(antecedente);

            if (!CapaFisica.guardarOActualizarObjeto(antecedenteFarmacologico)) {
                return false;
            } else {
                objetosCreados = objetosCreados + 1;
            }
        }

        if (objetosCreados == cantidadObjetosACrear) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Modifica el objeto farmacologico.
     *
     * @param datosFarmacologico Los nuevos datos
     * @param farmacologico El objeto a modificar
     * @return true si se modificó correctamente, false en caso contrario
     */
    public static boolean modificarFarmacologico(Object[] datosFarmacologico,
            Farmacologico farmacologico) {

        backUpModificacion(farmacologico);
        
        //Crea el objeto Farmacologico
        farmacologico = crearObjetoFarmacologico(
                datosFarmacologico, farmacologico);

        if (CapaFisica.guardarOActualizarObjeto(farmacologico)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea un objeto Farmacologico con los datos pasados por parámetro.
     *
     * @param datosFarmacologico Los datos particulares del objeto
     * @param farmacologico el objeto farmacologico
     * @return El objeto Farmacologico recien creado
     */
    private static Farmacologico crearObjetoFarmacologico(
            Object[] datosFarmacologico, Farmacologico farmacologico) {

        if (farmacologico == null) {
            farmacologico = new Farmacologico();
        }

        farmacologico.setAntecedente(null);

        farmacologico.setHoraFarmacologico(
                datosFarmacologico[
                FARMACOLOGICO_HORA].toString());

        farmacologico.setFechaFarmacologico(
                (Date) datosFarmacologico[
                FARMACOLOGICO_FECHA]);

        farmacologico.setNombreComercialMedicamento(
                NombreComercialMedicamentoLogica.getNombreComercialMedicamentoPorId(
                ((NombreComercialMedicamento) datosFarmacologico[
                FARMACOLOGICO_NOMBRE_COMERCIAL_MEDICAMENTO]).getIdNombreComercialMedicamento()));

        farmacologico.setDosisFarmacologico(
                datosFarmacologico[
                FARMACOLOGICO_DOSIS].toString());

        farmacologico.setIntervaloFarmacologico(
                datosFarmacologico[
                FARMACOLOGICO_INTERVALO].toString());

        farmacologico.setDuracionFarmacologico(
                datosFarmacologico[
                FARMACOLOGICO_DURACION].toString());

        farmacologico.setEfectivoFarmacologico(
                datosFarmacologico[
                FARMACOLOGICO_EFECTIVO].toString());

        farmacologico.setEfectoAdversoFarmacologico(
                datosFarmacologico[
                FARMACOLOGICO_EFECTO_ADVERSO].toString());

        farmacologico.setComentariosFarmacologico(
                datosFarmacologico[
                FARMACOLOGICO_COMENTARIOS].toString());

        farmacologico.setEstadoFarmacologico(
                datosFarmacologico[
                FARMACOLOGICO_ESTADO].toString());

        return farmacologico;
    }

    /**
     * Finaliza el tratamiento farmacológico y lo pasa como antecedente.
     *
     * @param farmacologico El tratamiento farmacológico a finalizar
     * @param paciente El paciente en cuestión
     * @return El objeto Farmacologico si se pudo finalizar, null en caso
     * contrario
     */
    public static Farmacologico finalizarFarmacologico(
            Farmacologico farmacologico, Paciente paciente) {
        //Setea el medicamento como No activo
        farmacologico.setEstadoFarmacologico("No activo");

        //Setea el medicamento como un antecedente
        if (AntecedenteLogica.agregarAntecedenteFarmacologico(
                farmacologico, paciente)) {
            return farmacologico;
        } else {
            return null;
        }
    }

    /**
     * Retorna el objeto Farmacologico según el ID.
     *
     * @param idFarmacologico El id del objeto Farmacologico
     * @return El objeto Farmacologico consultado, null si no existe
     */
    public static Farmacologico getFarmacologicoPorId(int idFarmacologico) {
        return FarmacologicoFisica.getFarmacologicoPorId(idFarmacologico);
    }

    /**
     * Retorna el vector de objetos Farmacologico según el id del paciente, ya
     * sea de antecedente o de tratamiento medicamentoso.
     *
     * @param idPaciente El id del paciente consultado
     * @return El vector de objetos Farmacologico consultado, null si no existe
     */
    public static Vector<Farmacologico> getVectorFarmacologicoPorIdPaciente(
            int idPaciente) {
        return mergeVectores(
                (unirVectores(
                    getVectorTratamientoMedicamentosoAmbulatorioFarmacologicoPorIdPaciente(
                    idPaciente),
                    getVectorTratamientoMedicamentosoInternacionFarmacologicoPorIdPaciente(
                    idPaciente))),
                getVectorAntecedenteFarmacologicoPorIdPaciente(idPaciente));
    }

    /**
     * Retorna el vector de objetos Farmacologico según el id del tratamiento.
     *
     * @param idTratamientoMedicamentoso El id del tratamiento asociado
     * @return El vector de objetos Farmacologico consultado, null si no existe
     */
    public static Vector<Farmacologico>
            getVectorFarmacologicoPorIdTratamientoMedicamentoso(
            int idTratamientoMedicamentoso) {
        return FarmacologicoFisica.getVectorFarmacologicoPorIdTratamientoMedicamentoso(
                idTratamientoMedicamentoso);
    }

    /**
     * Retorna el vector de objetos farmacologicos cuyo estado es activo según
     * un paciente.
     *
     * @param idPaciente El paciente consultado
     * @return El vector de objetos Farmacologico
     */
    public static Vector<Farmacologico> getVectorFarmacologicoActivoPorIdPaciente(
            int idPaciente) {
        return filtrarVectorFarmacologicoPorEstado(
                unirVectores(
                getVectorTratamientoMedicamentosoAmbulatorioFarmacologicoPorIdPaciente(
                idPaciente),
                getVectorTratamientoMedicamentosoInternacionFarmacologicoPorIdPaciente(
                idPaciente)), "Activo");
    }

    /**
     * Retorna el vector de objetos Farmacologico, correspondiente a los
     * antecedentes, según el paciente.
     *
     * @param idPaciente El paciente en cuestión
     * @return El vector de objetos Farmacologico consultado, null si no existe
     */
    public static Vector<Farmacologico>
            getVectorAntecedenteFarmacologicoPorIdPaciente(int idPaciente) {
        return FarmacologicoFisica.getVectorAntecedenteFarmacologicoPorIdPaciente(
                idPaciente);
    }

    /**
     * Retorna el vector de objetos Farmacologicos, que pertenecen a algún
     * tratamiento y excluyendo a los que son antecedentes de la práctica
     * ambulatoria, según el paciente.
     *
     * @param idPaciente El paciente en cuestión
     * @return El vector de objetos Farmacologico consultado, null si no existe
     */
    public static Vector<Farmacologico>
            getVectorTratamientoMedicamentosoAmbulatorioFarmacologicoPorIdPaciente(
            int idPaciente) {
        return FarmacologicoFisica.
                getVectorTratamientoMedicamentosoAmbulatorioFarmacologicoPorIdPaciente(
                idPaciente);
    }

    /**
     * Retorna el vector de objetos Farmacologicos, que pertenecen a algún
     * tratamiento y excluyendo a los que son antecedentes de la práctica
     * internacion, según el paciente.
     *
     * @param idPaciente El paciente en cuestión
     * @return El vector de objetos Farmacologico consultado, null si no existe
     */
    public static Vector<Farmacologico>
            getVectorTratamientoMedicamentosoInternacionFarmacologicoPorIdPaciente(
            int idPaciente) {
        return FarmacologicoFisica.
                getVectorTratamientoMedicamentosoInternacionFarmacologicoPorIdPaciente(
                idPaciente);
    }

    /**
     * Retorna el último antecedente farmacologico cargado del paciente.
     *
     * @param idAntecedente El id del antecedente asociado
     * @return El objeto Farmacologico consultado, null si no existe
     */
    public static Farmacologico getFarmacologicoMasRecientePorIdAntecedente(
            int idAntecedente) {
        Vector<Farmacologico> antecedenteFarmacologico = FarmacologicoFisica.
                getVectorFarmacologicoPorIdAntecedente(idAntecedente);

        if (antecedenteFarmacologico != null) {
            return antecedenteFarmacologico.lastElement();
        } else {
            return null;
        }
    }

    /**
     * Retorna el vector de objetos Farmacologico según el paciente filtrando
     * el estado
     *
     * @param vectorFarmacologico El vector de objetos a filtrar
     * @param idPaciente El paciente en cuestión
     * @return El vector de objetos Farmacologico consultado, null si no existe
     */
    public static Vector<Farmacologico> filtrarVectorFarmacologicoPorEstado(
            Vector<Farmacologico> vectorFarmacologico, String estado) {
        Vector<Farmacologico> vectorRetorno = new Vector<Farmacologico>();

        if (vectorFarmacologico != null) {
            for (int i = 0; i < vectorFarmacologico.size(); i++) {
                if (vectorFarmacologico.get(i).
                        getEstadoFarmacologico().equalsIgnoreCase(estado)) {
                    vectorRetorno.add(vectorFarmacologico.get(i));
                }
            }
        }

        if (vectorRetorno.size() > 0) {
            return vectorRetorno;
        } else {
            return null;
        }
    }

    /**
     * Escribe un archivo de texto el cual es una imagen del objeto que se
     * ha modificado y sus objetos asociados, guardando el mismo en la tabla.
     *
     * @param farmacologico El objeto a resguardar
     */
    private static void backUpModificacion(Farmacologico farmacologico) {
        String rutaLogLocal = DIRECTORIO_DE_TRABAJO + "\\" +
                    Farmacologico.class.getName() + ".txt";

        File log = CapaLogica.byteArrayToFile(rutaLogLocal,
                farmacologico.getArchivoLogFarmacologico());

        if (log == null) {
            log = new File(rutaLogLocal);
        }

        //Se manipula el log
        escribirLogFarmacologico(farmacologico, rutaLogLocal);

        //Se guarda
        byte[] bFile = new byte[(int) log.length()];

        try {
            FileInputStream fileInputStream = new FileInputStream(log);
            //convert file into array of bytes
            fileInputStream.read(bFile);
            fileInputStream.close();
        } catch (Exception exc) {
            System.err.println(exc.getMessage());
        }

        //Setea el adjunto
        farmacologico.setArchivoLogFarmacologico(bFile);
        eliminarArchivosTemporales();
    }

    /**
     * Escribe el objeto en un archivo.
     *
     * @param evolucion El objeto a resguardar
     * @param log El archivo en donde escribir
     * @return true si se escribio correctamente, false en caso contrario
     */
    public static boolean escribirLogFarmacologico(
            Farmacologico farmacologico, String rutaLog) {
        try {
            //Evolucion
            String farmacoogicoString = getFarmacologicoString(farmacologico);

            BufferedWriter bw = new BufferedWriter(new FileWriter(rutaLog, true));
            farmacoogicoString += "\n" + SEPARADOR + "\n";
            //Escribe los datos del objeto
            bw.write(farmacoogicoString);

            bw.close();
        } catch (IOException exception) {
            System.err.println(exception.getMessage());
            return false;
        }

        return true;
    }

    /**
     * Retorna todo el objeto Farmacologico en string.
     *
     * @param farmacologico El objeto a escribir
     */
    public static String getFarmacologicoString(Farmacologico farmacologico) {
        String farmacologicoString =
                "idFarmacologico: " +
                farmacologico.getIdFarmacologico() + "\n" +
                "horaFarmacologico: " +
                farmacologico.getHoraFarmacologico() + "\n" +
                "fechaFarmacologico: " +
                farmacologico.getFechaFarmacologico() + "\n" +
                "nombreComercialMedicamento: " +
                farmacologico.getNombreComercialMedicamento().getNombreNombreComercialMedicamento() + "\n" +
                "presentacionMedicamento: " +
                farmacologico.getNombreComercialMedicamento().getPresentacionesNombreComercialMedicamento() + "\n" +
                "intervaloFarmacologico: " +
                farmacologico.getIntervaloFarmacologico() + "\n" +
                "duracionFarmacologico: " +
                farmacologico.getDuracionFarmacologico() + "\n" +
                "efectivoFarmacologico: " +
                farmacologico.getEfectivoFarmacologico() + "\n" +
                "efectoAdversoFarmacologico: " +
                farmacologico.getEfectoAdversoFarmacologico() + "\n" +
                "comentariosFarmacologico: " +
                farmacologico.getComentariosFarmacologico() + "\n" +
                "estadoFarmacologico: " +
                farmacologico.getEstadoFarmacologico() + "\n";

        return farmacologicoString;
    }

    /**
     * Retorna el texto HTML correspondiente a la descripcion del farmacológico.
     *
     * @param farmacologico El objeto
     * @return El String que contiene el HTML
     */
    public static String getFarmacologicoHTML(Farmacologico farmacologico) {
        String farmacologicoHTML = "";
        
        if (farmacologico != null) {
            farmacologicoHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">FARMACOLÓGICO</font><br><br> "
                    + "<hr /><font size=\"3\" face=\"arial\" color=\"blue\">Fecha: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    CapaPresentacion.imprimirFecha(farmacologico.getFechaFarmacologico()) + " - " +
                    farmacologico.getHoraFarmacologico() + "</font><br>";

            if (farmacologico.getTratamientoMedicamentoso() != null) {
                farmacologicoHTML +=
                        "<font size=\"3\" face=\"arial\" color=\"blue\">Recetó: </font>"
                        + "<font size=\"3\" face=\"arial\">" +
                        farmacologico.getTratamientoMedicamentoso().getEvolucion().getApellidoProfesionalEvolucion() + ", " +
                        farmacologico.getTratamientoMedicamentoso().getEvolucion().getNombreProfesionalEvolucion() + "</font><br>"
                        + "<font size=\"3\" face=\"arial\" color=\"blue\">Estado: </font>"
                        + "<font size=\"3\" face=\"arial\">" +
                        farmacologico.getEstadoFarmacologico() + "</font><br><hr /><br>";
            }

            farmacologicoHTML +=
                    "<font size=\"3\" face=\"arial\" color=\"blue\">Medicamento:</font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    farmacologico.getNombreComercialMedicamento().getNombreNombreComercialMedicamento() + "</font><br><<br><"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Presentación:</font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    farmacologico.getNombreComercialMedicamento().getPresentacionesNombreComercialMedicamento() + "</font><br><br><"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Dosis:</font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    farmacologico.getDosisFarmacologico()+ "</font><br><br><"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Intervalo:</font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    farmacologico.getIntervaloFarmacologico()+ "</font><br><br><"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Duración:</font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    farmacologico.getDuracionFarmacologico()+ "</font><br><br><"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Efectivo:</font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    farmacologico.getEfectivoFarmacologico() + "</font><br><br><"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Efecto adverso:</font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    farmacologico.getEfectoAdversoFarmacologico() + "</font><br><br><"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Comentarios:</font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    farmacologico.getComentariosFarmacologico() + "</font><br><br><";
        } else {
            farmacologicoHTML = "<font size=\"3\" face=\"arial\" color=\"blue\">FARMACOLÓGICO</font><br><br> " +
                    "<hr /><font size=\"3\" face=\"arial\">No posee</font><br></font><hr />";
        }

        return farmacologicoHTML;
    }

    /**
     * Retorna el texto HTML correspondiente a la descripcion de los antecedentes
     * farmacológicos del paciente.
     *
     * @param paciente El paciente
     * @return El String que contiene el HTML
     */
    public static String getAntecedenteFarmacologicoHTML(Paciente paciente) {
        String antecedenteFarmacologicoHTML = "";

        Vector<Farmacologico> vectorAntecedenteFarmacologico =
                getVectorAntecedenteFarmacologicoPorIdPaciente(paciente.getIdPaciente());

        if (vectorAntecedenteFarmacologico != null) {
            for (int i = 0; i < vectorAntecedenteFarmacologico.size(); i++) {
                antecedenteFarmacologicoHTML +=
                "<font size=\"3\" face=\"arial\" color=\"blue\">ANTECEDENTE FARMACOLOGICO</font><<br><br> " +
                getFarmacologicoHTML(vectorAntecedenteFarmacologico.get(i));
            }
        } else {
            antecedenteFarmacologicoHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">ANTECEDENTES FARMACOLOGICOS</font><br> " +
                    "<font size=\"3\" face=\"arial\">No posee</font><br></font>";
        }

        return antecedenteFarmacologicoHTML;
    }

}
